// SPDX-License-Identifier: GPL-2.0
/dts-v1/;

#include "jz4740.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/iio/adc/ingenic,adc.h>
#include <dt-bindings/clock/ingenic,tcu.h>
#include <dt-bindings/input/input.h>

#define KEY_QI_QI	KEY_F13
#define KEY_QI_UPRED	KEY_RIGHTALT
#define KEY_QI_VOLUP	KEY_VOLUMEUP
#define KEY_QI_VOLDOWN	KEY_VOLUMEDOWN
#define KEY_QI_FN	KEY_LEFTCTRL

/ {
	compatible = "qi,lb60", "ingenic,jz4740";

	chosen {
		stdout-path = &uart0;
	};

	vcc: regulator@0 {
		compatible = "regulator-fixed";
		regulator-name = "vcc";

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
	};

	mmc_power: regulator@1 {
		compatible = "regulator-fixed";
		regulator-name = "mmc_vcc";
		gpio = <&gpd 2 0>;

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	amp_supply: regulator@2 {
		compatible = "regulator-fixed";
		regulator-name = "amp_supply";
		gpio = <&gpd 4 0>;
		enable-active-high;

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	amp: analog-amplifier {
		compatible = "simple-audio-amplifier";
		enable-gpios = <&gpb 29 GPIO_ACTIVE_HIGH>;
		VCC-supply = <&amp_supply>;
	};

	sound {
		compatible = "simple-audio-card";

		simple-audio-card,name = "QI LB60";
		simple-audio-card,format = "i2s";

		simple-audio-card,widgets =
			"Speaker", "Speaker",
			"Microphone", "Mic";
		simple-audio-card,routing =
			"MIC", "Mic",
			"Speaker", "OUTL",
			"Speaker", "OUTR",
			"INL", "LOUT",
			"INR", "ROUT";

		simple-audio-card,aux-devs = <&amp>;

		simple-audio-card,bitclock-master = <&dai_codec>;
		simple-audio-card,frame-master = <&dai_codec>;

		dai_cpu: simple-audio-card,cpu {
			sound-dai = <&aic>;
		};

		dai_codec: simple-audio-card,codec {
			sound-dai = <&codec>;
		};
	};

	keys {
		compatible = "gpio-keys";

		key {
			label = "Power";
			wakeup-source;
			linux,code = <KEY_POWER>;
			gpios = <&gpd 29 GPIO_ACTIVE_LOW>;
		};
	};

	keyboard {
		compatible = "gpio-matrix-keypad";

		col-scan-delay-us = <10>;
		debounce-delay-ms = <10>;
		wakeup-source;

		row-gpios = <&gpd 18 0 &gpd 19 0 &gpd 20 0 &gpd 21 0
			     &gpd 22 0 &gpd 23 0 &gpd 24 0 &gpd 26 0>;
		col-gpios = <&gpc 10 0 &gpc 11 0 &gpc 12 0 &gpc 13 0
			     &gpc 14 0 &gpc 15 0 &gpc 16 0 &gpc 17 0>;
		gpio-activelow;

		linux,keymap = <
			MATRIX_KEY(0, 0, KEY_F1)	/* S2 */
			MATRIX_KEY(0, 1, KEY_F2)	/* S3 */
			MATRIX_KEY(0, 2, KEY_F3)	/* S4 */
			MATRIX_KEY(0, 3, KEY_F4)	/* S5 */
			MATRIX_KEY(0, 4, KEY_F5)	/* S6 */
			MATRIX_KEY(0, 5, KEY_F6)	/* S7 */
			MATRIX_KEY(0, 6, KEY_F7)	/* S8 */

			MATRIX_KEY(1, 0, KEY_Q)	/* S10 */
			MATRIX_KEY(1, 1, KEY_W)	/* S11 */
			MATRIX_KEY(1, 2, KEY_E)	/* S12 */
			MATRIX_KEY(1, 3, KEY_R)	/* S13 */
			MATRIX_KEY(1, 4, KEY_T)	/* S14 */
			MATRIX_KEY(1, 5, KEY_Y)	/* S15 */
			MATRIX_KEY(1, 6, KEY_U)	/* S16 */
			MATRIX_KEY(1, 7, KEY_I)	/* S17 */
			MATRIX_KEY(2, 0, KEY_A)	/* S18 */
			MATRIX_KEY(2, 1, KEY_S)	/* S19 */
			MATRIX_KEY(2, 2, KEY_D)	/* S20 */
			MATRIX_KEY(2, 3, KEY_F)	/* S21 */
			MATRIX_KEY(2, 4, KEY_G)	/* S22 */
			MATRIX_KEY(2, 5, KEY_H)	/* S23 */
			MATRIX_KEY(2, 6, KEY_J)	/* S24 */
			MATRIX_KEY(2, 7, KEY_K)	/* S25 */
			MATRIX_KEY(3, 0, KEY_ESC)	/* S26 */
			MATRIX_KEY(3, 1, KEY_Z)	/* S27 */
			MATRIX_KEY(3, 2, KEY_X)	/* S28 */
			MATRIX_KEY(3, 3, KEY_C)	/* S29 */
			MATRIX_KEY(3, 4, KEY_V)	/* S30 */
			MATRIX_KEY(3, 5, KEY_B)	/* S31 */
			MATRIX_KEY(3, 6, KEY_N)	/* S32 */
			MATRIX_KEY(3, 7, KEY_M)	/* S33 */
			MATRIX_KEY(4, 0, KEY_TAB)	/* S34 */
			MATRIX_KEY(4, 1, KEY_CAPSLOCK)	/* S35 */
			MATRIX_KEY(4, 2, KEY_BACKSLASH)	/* S36 */
			MATRIX_KEY(4, 3, KEY_APOSTROPHE)	/* S37 */
			MATRIX_KEY(4, 4, KEY_COMMA)	/* S38 */
			MATRIX_KEY(4, 5, KEY_DOT)	/* S39 */
			MATRIX_KEY(4, 6, KEY_SLASH)	/* S40 */
			MATRIX_KEY(4, 7, KEY_UP)	/* S41 */
			MATRIX_KEY(5, 0, KEY_O)	/* S42 */
			MATRIX_KEY(5, 1, KEY_L)	/* S43 */
			MATRIX_KEY(5, 2, KEY_EQUAL)	/* S44 */
			MATRIX_KEY(5, 3, KEY_QI_UPRED)	/* S45 */
			MATRIX_KEY(5, 4, KEY_SPACE)	/* S46 */
			MATRIX_KEY(5, 5, KEY_QI_QI)	/* S47 */
			MATRIX_KEY(5, 6, KEY_RIGHTCTRL)	/* S48 */
			MATRIX_KEY(5, 7, KEY_LEFT)	/* S49 */
			MATRIX_KEY(6, 0, KEY_F8)	/* S50 */
			MATRIX_KEY(6, 1, KEY_P)	/* S51 */
			MATRIX_KEY(6, 2, KEY_BACKSPACE)/* S52 */
			MATRIX_KEY(6, 3, KEY_ENTER)	/* S53 */
			MATRIX_KEY(6, 4, KEY_QI_VOLUP)	/* S54 */
			MATRIX_KEY(6, 5, KEY_QI_VOLDOWN)	/* S55 */
			MATRIX_KEY(6, 6, KEY_DOWN)	/* S56 */
			MATRIX_KEY(6, 7, KEY_RIGHT)	/* S57 */

			MATRIX_KEY(7, 0, KEY_LEFTSHIFT)	/* S58 */
			MATRIX_KEY(7, 1, KEY_LEFTALT) /* S59 */
			MATRIX_KEY(7, 2, KEY_QI_FN)	/* S60 */
			>;
	};

	spi {
		compatible = "spi-gpio";
		#address-cells = <1>;
		#size-cells = <0>;

		sck-gpios = <&gpc 23 GPIO_ACTIVE_HIGH>;
		mosi-gpios = <&gpc 22 GPIO_ACTIVE_HIGH>;
		cs-gpios = <&gpc 21 GPIO_ACTIVE_LOW>;
		num-chipselects = <1>;
	};

	usb_charger: charger {
		compatible = "gpio-charger";
		charger-type = "usb-sdp";
		gpios = <&gpd 28 GPIO_ACTIVE_LOW>;
		status-gpios = <&gpc 27 GPIO_ACTIVE_LOW>;
	};

	simple_battery: battery {
		compatible = "simple-battery";
		voltage-min-design-microvolt = <3600000>;
		voltage-max-design-microvolt = <4200000>;
	};

	pmu {
		compatible = "ingenic,jz4740-battery";
		io-channels = <&adc INGENIC_ADC_BATTERY>;
		io-channel-names = "battery";
		power-supplies = <&usb_charger>;
		monitored-battery = <&simple_battery>;
	};

	hwmon {
		compatible = "iio-hwmon";
		io-channels = <&adc INGENIC_ADC_AUX>;
	};

	panel: panel {
		compatible = "giantplus,gpm940b0";

		power-supply = <&vcc>;

		port {
			panel_input: endpoint {
				remote-endpoint = <&panel_output>;
			};
		};
	};

	usb_phy: usb-phy {
		compatible = "usb-nop-xceiv";
		#phy-cells = <0>;

		vcc-supply = <&vcc>;
	};
};

&ext {
	clock-frequency = <12000000>;
};

&rtc_dev {
	system-power-controller;
};

&uart0 {
	pinctrl-names = "default";
	pinctrl-0 = <&pins_uart0>;
};

&uart1 {
	status = "disabled";
};

&nemc {
	nandc: nand-controller@1 {
		compatible = "ingenic,jz4740-nand";
		reg = <1 0 0x4000000>;

		#address-cells = <1>;
		#size-cells = <0>;

		ingenic,bch-controller = <&ecc>;

		pinctrl-names = "default";
		pinctrl-0 = <&pins_nemc>;

		rb-gpios = <&gpc 30 GPIO_ACTIVE_LOW>;

		nand@1 {
			reg = <1>;

			nand-ecc-step-size = <512>;
			nand-ecc-strength = <4>;
			nand-ecc-mode = "hw";
			nand-is-boot-medium;
			nand-on-flash-bbt;

			partitions {
				compatible = "fixed-partitions";
				#address-cells = <1>;
				#size-cells = <1>;

				partition@0 {
					label = "boot";
					reg = <0x0 0x400000>;
				};

				partition@400000 {
					label = "kernel";
					reg = <0x400000 0x400000>;
				};

				partition@800000 {
					label = "rootfs";
					reg = <0x800000 0x0>;
				};
			};
		};
	};
};

&lcd {
	pinctrl-names = "default";
	pinctrl-0 = <&pins_lcd>;

	port {
		panel_output: endpoint {
			remote-endpoint = <&panel_input>;
		};
	};
};

&udc {
	phys = <&usb_phy>;
};

&pinctrl {
	pins_lcd: lcd {
		function = "lcd";
		groups = "lcd-8bit";
	};

	pins_nemc: nemc {
		function = "nand";
		groups = "nand-cs1";
	};

	pins_uart0: uart0 {
		function = "uart0";
		groups = "uart0-data";
		bias-disable;
	};

	pins_mmc: mmc {
		mmc {
			function = "mmc";
			groups = "mmc-1bit", "mmc-4bit";
			bias-disable;
		};

		mmc-gpios {
			pins = "PD0", "PD2";
			bias-disable;
		};
	};
};

&mmc {
	bus-width = <4>;
	max-frequency = <24000000>;
	cd-gpios = <&gpd 0 GPIO_ACTIVE_HIGH>;
	vmmc-supply = <&mmc_power>;

	pinctrl-names = "default";
	pinctrl-0 = <&pins_mmc>;
};

&tcu {
	/* 750 kHz for the system timer and clocksource */
	assigned-clocks = <&tcu TCU_CLK_TIMER0>, <&tcu TCU_CLK_TIMER1>;
	assigned-clock-rates = <750000>, <750000>;
};
